大数据Spark生态系统 修仙之道 Scala Blog

2019-05-01 Docs Language:简体中文 & English Programing Scala Website:www.geekparkhub.com OpenSource GitHub repo size in bytes GeekDeveloper:JEEP-711 Github:github.com/geekparkhub Gitee:gitee.com/geekparkhub

🐘 Scala Technology 修仙之道 炼精化炁 🐘

Alt text


0. 学习前你需要了解

在继续本教程之前,你应该了解一些基本计算机编程术语.

Spark是新一代基于内存级大数据计算框架,是大数据重要内容.

Spark是基于Scala编程语言构建完成,如果你学习过Java编程语言,将有助于你更快了解掌握Scala编程语言.

1. Scala 概述

Scala是一门多范式(multi-paradigm)编程语言,设计初衷是要集成面向对象编程和函数式编程各种特性.

Scala运行在Java虚拟机上,并兼容现有Java程序.

Scala源代码被编译成Java字节码,所以它可以运行于JVM之上,并可以调用现有Java类库.

Spark的兴起,带动了Scala语言的发展.

2. Scala 语言诞生

创始人马丁 · 奥德斯基(Martin Oderskv)是编译器及编程的狂热爱好者.

长时间的编程之后,希望发明一种语言,能够让写程序这样的基础工作变得高效,简单.

所以当接触到JAVA语言后,对JAVA这门便携式,运行在网络,且存在垃圾回收的语言产生了极大的兴趣,所以决定将函数式编程语言的特点融合到JAVA中.

由此发明了两种语言(Pizza & Scala) / Pizza 和 Scala极大地推动了JAVA编程语言的发展.
jdk5.0泛型,for循环增强,自动类型转换等,都是从Pizza,引入的新特性.

jdk8.0的类型推断,Lambda表达式就是从Scala引入的特性.

且现在主流JVM 的javac编译器就是马丁 · 奥德斯基编写出来的,Jdks5.0 & Jdk8.0的编辑器就是马丁 · 奥德斯基编写的,因此马丁 · 奥德斯基一个人的战斗力抵得上一个JAVA开发团队.

3. Scala 语言特点

Scala是一门以java虚拟机(JVM)为运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言.

Scala是一门多范式(multi-paradigm)的编程语言,Scala支持面向对象和函数式编程.

Scala源代码(.scala)会被编译成Java字节码(.class),然后运行于JVM之上,并可以调用现有的Java类库,实现两种语言的无缝对接.

Scala单作为一门语言来看,非常简洁高效(三元运算 / ++ / –).

Scala 在设计时,马丁·奥德斯基是参考了Java的设计思想,可以说Scala是源于java,同时马丁·奥德斯基也加入了自己的思想,将函数式编程语言的特点融合到JAVA中,因此,对于学习过Java的开发者,只要在学习Scala过程中,搞清楚Scala和java相同点和不同点,就可以快速的掌握Scala这门语言.

4. Scala 部署

4.1 MacOs 部署 Scala

systemhub:dev_package system$ pwd
/Users/system/home/work/develop/work_flow/software/dev_package
systemhub:dev_package system$ tar -zxvf scala-2.11.8.tgz -C /Users/system/home/work/develop/work_flow/module/
systemhub:work_flow system$ cd module/
systemhub:module system$ mv scala-2.11.8/ scala
systemhub:module system$ ls -ll
total 0
drwxr-xr-x 10 system staff 340 2 25 20:52 maven
drwxr-xr-x@ 17 system staff 578 5 9 11:46 tomcat
drwxr-xr-x 13 system staff 442 2 28 23:28 hadoop
drwxr-xr-x 6 system staff 204 3 4 2016 scala
systemhub:module system$
systemhub:module system$ cd scala/
systemhub:scala system$ pwd
/Users/system/home/work/develop/work_flow/module/scala
systemhub:scala system$ sudo vim /etc/profile
## SET SCALA_HOME
export SCALA_HOME=/Users/system/home/work/develop/work_flow/module/scala
export PATH=$PATH:$SCALA_HOME/bin
systemhub:scala system$ source /etc/profile
systemhub:scala system$ scala
Welcome to Scala 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8).
Type in expressions for evaluation. Or try :help.
scala> print("Hello World!");
Hello World!
scala> :quit
systemhub:scala system$

4.2 Linux 部署 Scala

[root@systemhub511 software]# tar -zxvf scala-2.11.8.tgz -C /opt/module/
[root@systemhub511 module]# mv scala-2.11.8/ scala
[root@systemhub511 module]# ll
total 44
drwxr-xr-x. 9 root root 4096 Feb 24 21:55 tomcat
drwxr-xr-x. 3 root root 4096 May 12 16:12 cdh_flow
drwxr-xr-x. 3 root root 4096 May 20 22:46 datas
drwxr-xr-x. 10 root root 4096 Apr 11 17:02 flume
drwxr-xr-x. 3 root root 4096 May 8 20:55 HA
drwxr-xr-x. 12 10011 10011 4096 Mar 3 00:42 hadoop
drwxr-xr-x. 8 root root 4096 May 6 23:31 hbase
drwxr-xr-x. 8 uucp 143 4096 Dec 20 2017 jdk1.8
drwxr-xr-x. 8 root root 4096 Apr 17 14:15 kafka
drwxrwxr-x. 6 1001 1001 4096 Mar 4 2016 scala
drwxr-xr-x. 11 1001 1001 4096 Apr 17 13:31 zookeeper
[root@systemhub511 module]#
[root@systemhub511 module]# cd scala/
[root@systemhub511 scala]# pwd
/opt/module/scala
[root@systemhub511 scala]# vim /etc/profile
## SET SCALA_HOME
export SCALA_HOME=/opt/module/scala
export PATH=$PATH:$SCALA_HOME/bin
[root@systemhub511 scala]# source /etc/profile
[root@systemhub511 module]# scala
Welcome to Scala 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8).
Type in expressions for evaluation. Or try :help.
scala> print("Hello World!");
Hello World!
scala> :quit
[root@systemhub511 bin]#

5. Scala 插件 For JetBrains IntelliJ IDEA

enter image description here

6. Scala Quick Start

package com.geekparkhub.core.scala.quickstart
/**
* Geek International Park | 极客国际公园
* GeekParkHub | 极客实验室
* Website | https://www.geekparkhub.com/
* Description | Open开放 · Creation创想 | OpenSource开放成就梦想 GeekParkHub共建前所未见
* HackerParkHub | 黑客公园枢纽
* Website | https://www.hackerparkhub.com/
* Description | 以无所畏惧的探索精神 开创未知技术与对技术的崇拜
* GeekDeveloper : JEEP-711
*
* @author system
* <p>
* QuickStartScala
* <p>
*/
object QuickStartScala {
def main(args: Array[String]): Unit = {
println("Scala ~ Hello World!");
}
}
Scala ~ Hello World!

enter image description here

6.1 反编译 Scala程序 执行流程

6.1.1 Java模拟Scala代码

package com.geekparkhub.core.scala.decompile;
/**
* Geek International Park | 极客国际公园
* GeekParkHub | 极客实验室
* Website | https://www.geekparkhub.com/
* Description | Open开放 · Creation创想 | OpenSource开放成就梦想 GeekParkHub共建前所未见
* HackerParkHub | 黑客公园枢纽
* Website | https://www.hackerparkhub.org/
* Description | 以无所畏惧的探索精神 开创未知技术与对技术的崇拜
* GeekDeveloper : JEEP-711
*
* @author system
* <p>
* QuickStartScala
*
* Scala 执行流程
* 1. object 在底层会生成两个类QuickStartScala,QuickStartScala$
* 2. `QuickStartScala`中有main函数,调用`QuickStartScala$` 类的一个静态对象 `MODULES$`
* <p>
*/
public final class QuickStartScala {
public static void main(String[] paramArrayOfString) {
// 3. QuickStartScala$.MODULE$. 对象是静态的,通过该对象调用QuickStartScala$的main函数
QuickStartScala$.MODULE$.main(paramArrayOfString);
}
}
final class QuickStartScala$ {
public static final QuickStartScala$ MODULE$;
static {
MODULE$ = new QuickStartScala$();
}
/**
* 可以理解为在main函数编写的代码放在QuickStartScala$的main函数中,其实是在底层执行scala编译器做了包装
* @param args
*/
public static void main(String[] args) {
System.out.println("Scala ~ Hello World!");
}
}

6.1.2 Scala执行流程

enter image description here

6.1.3 Scala程序 开发注意事项 (重点)

6.2 Scala 转义字符

6.3 Scala 语言输出方式

package com.geekparkhub.core.scala.demo
/**
* Geek International Park | 极客国际公园
* GeekParkHub | 极客实验室
* Website | https://www.geekparkhub.com/
* Description | Open开放 · Creation创想 | OpenSource开放成就梦想 GeekParkHub共建前所未见
* HackerParkHub | 黑客公园枢纽
* Website | https://www.hackerparkhub.org/
* Description | 以无所畏惧的探索精神 开创未知技术与对技术的崇拜
* GeekDeveloper : JEEP-711
*
* @author system
* <p>
* DemoTest
* <p>
*/
object DemoTest {
def main(args: Array[String]): Unit = {
/**
* String stitching output
* 字符串拼接 输出
*/
val parameter1: String = "Hello "
var parameter2: String = "World!"
println(parameter1 + parameter2)
/**
* Dividing line
* 分割线
*/
println(s"-----------------------------------------------------------------------------------------")
/**
* Printf formatted output
* printf格式化 输出
*/
var name: String = "TestUser001"
var age: Int = 66;
var investment: Float = 722.37f
var assets: Double = 777777777.158
printf("name is = %s | age is = %d | investment is = %.2f | assets is = %.3f", name, age, investment, assets)
/**
* Dividing line
* 分割线
*/
println(s"\n-----------------------------------------------------------------------------------------")
/**
* String + $ output
* 字符串+$ 输出
*/
println(s"Demo1 info : \n name is = $name \n age is = $age \n investment is = $investment \n assets is = $assets")
/**
* Dividing line
* 分割线
*/
println(s"-----------------------------------------------------------------------------------------")
/**
* Expression +$ output
* 表达式+$ 输出
*/
println(s"Demo2 info : \n name is = $name \n age is = $age \n investment is = ${investment + 10} \n assets is = ${assets * 20}")
}
}
Hello World!
-----------------------------------------------------------------------------------------
name is = TestUser001 | age is = 66 | investment is = 722.37 | assets is = 777777777.158
-----------------------------------------------------------------------------------------
Demo1 info :
name is = TestUser001
age is = 66
investment is = 722.37
assets is = 7.77777777158E8
-----------------------------------------------------------------------------------------
Demo2 info :
name is = TestUser001
age is = 66
investment is = 732.37
assets is = 1.555555554316E10

6.4 Scala 注释 (comment)

6.5 Scala 代码规范说明

/** Contains a fallback builder for arrays when the element type
* does not have a class tag. In that case a generic array is built.
*/
class FallbackArrayBuilding {
/** A builder factory that generates a generic array.
* Called instead of `Array.newBuilder` if the element type of an array
* does not have a class tag. Note that fallbackBuilder factory
* needs an implicit parameter (otherwise it would not be dominated in
* implicit search by `Array.canBuildFrom`). We make sure that
* implicit search is always successful.
*/
implicit def fallbackCanBuildFrom[T](implicit m: DummyImplicit): CanBuildFrom[Array[_], T, ArraySeq[T]] =
new CanBuildFrom[Array[_], T, ArraySeq[T]] {
def apply(from: Array[_]) = ArraySeq.newBuilder[T]
def apply() = ArraySeq.newBuilder[T]
}
}

6.6 Scala 官方API指南

Scala 官方API指南 : scala-lang.org/api/2.11.8

6.7 Scala 变量

变量使用基本步骤

Scala 变量基本使用

var age : Int = 10
var sal : Double = 10.9
var name : String = "tom"
var isPass : Boolean = true
var score : Float = 70.9f

Scala 变量使用说明

6.8 Scala 数据类型

6.8.1 Scala 数据类型体系

enter image description here

6.8.2 Scala 数据类型列表

数据类型 描述
Byte 8位有符号补码整数
Short 16位有符号补码整数
Int 32位有符号补码整数
Long 64位有符号补码整数
Float 32位标准单精度浮点数
Double 64位标准单精度浮点数
Char 16位无符号Unicode字符
String 字符序列
Boolean true / false
Unit 表示无值等同于void
Null null
Nothing 任何其他类型的子类型
Any 所有类的超类
AnyRef 引用类的基类

6.8.3 Scala 整形数据类型

数据类型 描述
Byte [1] 8位有符号补码整数,数值区间为-128到127
Short [2] 16位有符号补码整数,数值区间为-32768到32767
Int [4] 32位有符号补码整数,数值区间为-2147483648到2147483647
Long [8] 64位有符号补码整数,数值区间为-9223372036854775808到9223372036854775807=2的(64-1)次方-1

6.8.4 Scala 浮点数据类型

数据类型 描述
Float [4] 32位标准单精度浮点数
Double [8] 64位标准双精度浮点数

6.8.5 Scala (Char) 字符数据类型

6.8.6 Scala (Boolean) 布尔数据类型

6.8.7 Scala (Unit / Null / Nothing) 数据类型

数据类型 描述
Unit 表示无值等同于void
Null null,Null类型只有一个实例null
Nothing 任何其他类型的子类型

6.8.8 Scala 值类型转换

6.8.8.1 值类型隐式转换
6.8.8.2 高级隐式转换和隐式函数
6.8.8.3 强制类型转换
java : int num = (int)2.5
scala : var num : Int = 2.7.toInt //对象
object DemoTest002 {
def main(args: Array[String]): Unit = {
val num1: Int = 10 * 3.5.toInt + 6 * 1.5.toInt
val num2: Int = (10 * 3.5 + 6 * 1.5).toInt
println(num1 +" - "+num2)
}
}
6.8.8.4 数据类型转换 实例
1. var s : Short = 5 //ok
s = s-2 //error Int -> Short
2. var b : Byte = 3 //ok
b = b + 4 // error Int ->Byte
b = (b+4).toByte // ok,使用强制转换
3. var c : Char = 'a' //ok
var i : Int = 5 //ok
var d : Float = .314F //ok
var result : Double = c+i+d //ok Float->Double
4. var b : Byte = 5 //ok
var s : Short = 3 //ok
var t : Short = s + b //error Int->Short
var t2 = s + b //ok,使用类型推导
6.8.8.5 值类型和String类型转换
// 基本类型转String类型
val d1 = 1.2
val s1 = d1 + ""
println(d1 +" ~ "+ s1)
// String类型转基本数据类型
val s2 = "11"
val int: Int = s2.toInt
val byte: Byte = s2.toByte
val double: Double = s2.toDouble
val long: Long = s2.toLong
println(s2 +" ~ "+ int +" ~ "+ byte +" ~ "+ double +" ~ "+ long)
6.8.8.6 标识符命名规范
6.8.8.6.1 标识符概念
6.8.8.6.2 标识符命名规则
6.8.8.6.3 标识符举例说明
// 首字符为操作符(比如+ -* /),后续字符也需跟操作符,至少一个
val ++ = "hello,scala"
println(++)
val -+*/ = 90
println(-+*/)
val `true` = "hello"
println(`true`)
6.8.8.6.4 标识符命名注意事项
6.8.8.6.5 Scala 39个关键字
package, import, class, object, trait, extends, with, type, forSome
private, protected, abstract, sealed, final, implicit, lazy, override
try, catch, finally, throw
if, else, match, case, do, while, for, return, yield
true, false, null
def, val, var
this, super
new

6.9 Scala 运算符

6.9.1 运算符介绍

6.9.2 算术运算符

运算符 运算 范例 结果
+ 正号 +1 1
- 负号 b=4; -b -4
+ 5+5 10
- 6-4 2
* 3*4 12
/ 5/5 1
% 取余 7%5 2
+ 字符串相加 “he”+”llo” “hello”
// 除法 算数运算使用
val r1: Int = 10 /3
val r2: Double = 10 /3
val r3: Double = 10.0 /3
println(r1 +" ~ "+ r2 +" ~ " + r3 + " ~ " +r3.formatted("%.2f"))
// 取余 算数运算使用 | 取余运算原则 : a % b = a - a/b * b
println(10 % 3)
println(10 % -3)
println(-10 % 3)
println(-10 % -3)

6.9.3 关系运算符 (比较运算符)

运算符 运算 范例 结果
== 相等于 4==3 false
!= 不等于 4!=3 true
< 小于 4<3 false
> 大于 4>3 true
<= 小于等于 4<=3 false
>= 大于等于 4>=3 true

6.9.4 逻辑运算符

运算符 运算 范例 结果
&& 逻辑与 (A&&B) false
逻辑或 (A或B) true
! 逻辑非 !(A&&B) true

6.9.5 赋值运算符

运算符 运算 范例 结果
= 将值赋给左值 C = A + B 将A+B结果赋值为C
+= 相加后再赋值 C += A C = C + A
-= 相减后再赋值 C -= A C = C - A
*= 相乘后再赋值 C *= A C = C * A
/= 相除后再赋值 C /= A C = C / A
%= 取余后再赋值 C %= A C = C % A
<<= 左移后再赋值 C <<= 2 C = C << 2
>>= 右移后再赋值 C >>= 2 C = C >> 2
&= 按位与再赋值 C $= 2 C = C & 2
^= 按位异或后再赋值 C ^= 2 C = C ^ 2
或= 按位或后再赋值 C 或= 2 C = C 或 2
运算符 运算 范例 结果
& 按位与运算符 (a&b) 结果12,二进制0000 1100
按位或与运算符 (a或b) 结果61,二进制0011 1101
^ 按位异或运算符 (a^b) 结果49,二进制0011 0001
~ 按位取反运算符 (~a) 结果-61,二进制1100 0011,在一个有符号二进制数的补码形式
<< 左移动运算符 a<<2 结果240,二进制1111 0000
>> 右移动运算符 a>>2 结果15,二进制0000 1111
>>> 无符号右移 A>>>2 结果,二进制0000 1111

6.9.6 运算符优先级

6.9.7 键盘输入语句

object DemoTest003 {
def main(args: Array[String]): Unit = {
println("Please type in your name")
val name = StdIn.readLine()
println("Please enter age")
val age = StdIn.readInt()
println("Please enter the height")
val height = StdIn.readDouble()
printf("Your input information is : name=%s age=%d height=%.2f", name, age, height)
}
}

🔒 尚未解锁 正在探索中… 尽情期待 Blog更新! 🔒

6.10 Scala 程序流程控制

6.11 Scala 函数式编程 基础

6.12 Scala 面向对象编程 (基础部分)

6.13 Scala 面向对象编程 (中级部分)

6.14 Scala 面向对象编程 (高级特性)

6.15 Scala 隐式转换 & 隐式值

6.16 Scala 数据结构 (上) - 集合

6.17 Scala 数据结构 (下) - 集合操作

6.18 Scala 模式匹配

6.19 Scala 函数式编程 高级

6.20 Scala 使用递归方式去思考编程

7. 修仙之道 技术架构迭代 登峰造极之势

Alt text


💡如何对该开源文档进行贡献💡

  1. Blog内容大多是手敲,所以难免会有笔误,你可以帮我找错别字。

  2. 很多知识点我可能没有涉及到,所以你可以对其他知识点进行补充。

  3. 现有的知识点难免存在不完善或者错误,所以你可以对已有知识点的修改/补充。

  4. 💡欢迎贡献各领域开源野生Blog&笔记&文章&片段&分享&创想&OpenSource Project&Code&Code Review

  5. 🙈🙈🙈🙈🙈🙈🙈🙈🙈🙈🙈 issues: geekparkhub.github.io/issues 🙈🙈🙈🙈🙈🙈🙈🙈🙈🙈🙈

希望每一篇文章都能够对读者们提供帮助与提升,这乃是每一位笔者的初衷


💌感谢您的阅读 欢迎您的留言与建议💌

捐助 项目的发展离不开你的支持,请开发者喝杯☕Coffee☕吧!

enter image description here

致谢

捐助时请备注 UserName

ID UserName Donation Money Consume
1 Object WeChatPay 5RMB 一杯可乐
2 泰迪熊看月亮 AliPay 20RMB 一杯咖啡
3 修仙道长 WeChatPay 10RMB 两杯可乐

License 开源协议

Apache License Version 2.0